#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
 
#define SIZEOF(arr) (sizeof(arr)/sizeof(arr[0]))
#define PrintInt(expr) printf("%s:%d\n",#expr,(expr))

enum {false,true};

void fork_test()
{
	int i;
	for(i=0; i<2; i++){
		fork();
		printf("-");
		fflush(stdout); /* 如果不调用的话，fork就会把printf缓存也复制到子进程中， 导致打印8个-*/
	}
}

void printf_test()
{
	int i=43;
	printf("%d\n",printf("%d",printf("%d",i)));

	//float a = 12.5;
	//printf("%d\n", a);
	//printf("%d\n", (int)a);
	//printf("%d\n", *(int *)&a);

	i = 10;
	printf("i : %d\n",i);
	printf("sizeof(i++) is: %lu\n",sizeof(i++)); /*sizeof 不是函数，程序编译时就被sizeof的结果替代了，所以运行时没有i++表达式*/
	printf("i : %d\n",i);

	/*
	 * "hello"[2] ==  2["hello"]
	 * 如果你知道：a[i] 其实就是 *(a+i)也就是 *(i+a)，所以如果写成 i[a] 应该也不难理解了。
	 * */
	int a=3, b = 5;
	printf(&a["Ya!Hello! how is this? %s\n"], &b["junk/super"]);
	printf(&a["WHAT%c%c%c  %c%c  %c !\n"], 1["this"], 2["beauty"],0["tool"],0["is"],3["sensitive"],4["CCCCCC"]);

	char dummy[80];
	printf("Enter a string:\n");
	int t_count = scanf("%[^r]",dummy);  /* scanf中的”%[^r]“是从中作梗的东西。意思是遇到字符r就结束了 */
	printf("count=%d, %s\n",t_count, dummy);
}

void digit_test()
{

	/* The powers of 10 */
	int pot[] = {
		0001,
		0010,
		0100,
		1000
	};
	/* 以0开头的数字都是八进制的*/

	int i;
	for(i=0;i<SIZEOF(pot);i++)
		PrintInt(pot[i]);

}

void  dig_incre()
{
	int i = 6;
	if( ((++i < 7) && ( i++/6)) || (++i <= 9))
		;

	printf("%d\n",i);
}

void switch_test()
{
	int a=1;      
	switch(a)      
	{   
		int b=20;          
		case 1: 
		printf("b is %d\n",b); /*switch中b变量没有被初始化*/
		break;
		default:
		printf("b is %d\n",b);
		break;
	}
}

int FiveTimes(int a)  
{
	int t;
	//t = a<<2 + a; 
	t = (a<<2) + a; /* + 比 << 优先级高*/
	return t;
}
 
int continue_test()
{
	int i=1;
	do
	{
		printf("%d\n",i);
		i++;

		if(i < 15)
			continue; /* continue的含义是不执行循环体之后语义，而直接到循环点。明显while(false)不属于循环体*/
	} while(false);

	return 0;
}

int macro_test()
{
#define f(a,b) a##b
#define g(a)   #a
#define h(a) g(a)

	printf("%s\n", h(f(1,2)));
	printf("%s\n", g(f(1,2)));
	return 0;
}

void foobar1(void)   /* void 等于无参数 */
{
	printf("In foobar1\n");
}
 
void foobar2()   /* forbar2()等于forbar2(...)等于参数类型未知 */
{
	printf("In foobar2\n");
}
 
void stru_test()
{
	struct {
		int x;
		struct {
			int y, z;
		} nested;
	} nested_test = 
	{ .x = 1, 2, 3, .nested.y = 5, 6};

	printf("struct nested_test.x=%d nested_test.y=%d nested_test.z=%d\n", 
			nested_test.x,nested_test.nested.y,nested_test.nested.z) ;
}

void location_var()
{

}

int main(void)
{
	//printf_test();
	//digit_test();
	//dig_incre();
	//PrintInt(FiveTimes(4));
	//continue_test();
	//macro_test();
	//foobar1();
	//foobar2(33,44);
	//stru_test();

	return 0;
}
